//
//  NMPORequestManager.swift
//  NMPO
//
//  Created by PowerfullClean on 2023/10/31.
//

import UIKit
import Alamofire
import SwiftyJSON

let nmpo_vpn_url = "https://api.marsproxy.link/iPZbB/eNGl/akECN/"

let nmpo_vpn_dKey = "R09a1yF6LEenh2oK"

typealias NMPOSuccessHandle = (_ response: Any?)->()
typealias NMPOFailurHandle = (_ error: NSError?)->()
class NMPORequestManager: NSObject {
    func nmpo_tbaHeader() -> HTTPHeaders {
        return [
            "LGKM": NMPOCommon.nmpo_bundleIdentifier
        ]
    }
    func nmpo_requestUrl() -> String {
        return  nmpo_vpn_url
    }
    func nmpo_requestMethod() -> HTTPMethod {
        return .get
    }
    func nmpo_statrRequest(nmpo_successBlock:NMPOSuccessHandle? = nil) {
        AF.request(nmpo_requestUrl(), method: nmpo_requestMethod(), parameters: nil, headers: nmpo_tbaHeader()){ nmpo_request in
            nmpo_request.timeoutInterval = 15
        }.responseString { nmpo_response in
            switch nmpo_response.result {
            case .failure(_):
                return
            case .success(_):
                break
            }
            guard let nmpo_responseString = nmpo_response.value else {
                return
            }
            nmpo_successBlock?(nmpo_responseString)
        }
    }
}

//MARK: - nmpo smart 展示
class NMPOVPNRequestList1: NMPORequestManager {
    
}
//MARK: - nmpo list 展示
class NMPOVPNRequestList2: NMPORequestManager {
    override func nmpo_requestMethod() -> HTTPMethod {
        return .post
    }
}

//MARK: - nmpo vpn update
extension NMPOManager {
    func nmpo_vpnList1Request() {
        let nmpo_api = NMPOVPNRequestList1()
        nmpo_api.nmpo_statrRequest { response in
            if let nmpo_response = response as? String {
                
                
                self.nmpo_saveSrKey(nmpo_key: nmpo_vpnResList1_key, nmpo_value: nmpo_response)
                self.nmpo_updateDataBaseSmartAddress()
                
            }
        }
    }
    func nmpo_vpnList2Request() {
        let nmpo_api = NMPOVPNRequestList2()
        nmpo_api.nmpo_statrRequest{ response in
            if let nmpo_response = response as? String {
                //                self.nmpo_pingVPNIPAddressAction(nmpo_vpnReqModel: nmpo_model, nmpo_group: self.pingGroup2, nmpo_queue: self.pingQueue2)
                self.nmpo_saveSrKey(nmpo_key: nmpo_vpnResList2_key, nmpo_value: nmpo_response)
                self.nmpo_updateDataBaseListAddress()
            }
        }
    }
    //MARK: - 更新本地数据库的list ip
    func nmpo_updateDataBaseListAddress() {
        //TODO: 目前只处理 list1
        //        let nmpo_reqModel = nmpo_getVPNRequestModel(nmpo_savePath: nmpo_vpnResList1_key)
        //        self.nmpo_pingVPNIPAddressAction(nmpo_vpnReqModel: nmpo_reqModel, nmpo_group: self.pingGroup2, nmpo_queue: self.pingQueue2) {
        //            let nmpo_models = nmpo_reqModel.nmpo_crkZQ.nmpo_qlHTP.filter { nmpo_model in
        //                return nmpo_model.nmpo_pingValue < 800
        //            }
        //            if nmpo_models.count == 0 {
        //                return
        //            }
        //            // 删除旧的 所有地址
        //            self.nmpo_deleteServeListModels()
        //            // 添加新的
        //            for nmpo_model in nmpo_models {
        //                self.nmpo_createServerModel(nmpo_country:nmpo_model.nmpo_cTvsK,nmpo_address: nmpo_model.nmpo_bTuIq, nmpo_password: nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL, nmpo_port: "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)")
        //            }
        //            NotificationCenter.default.post(name: nmpo_vpnlistUpdate_noti, object: nil)
        //        }
        
    }
    //MARK: - 更新本地数据库的smart ip
    func nmpo_updateDataBaseSmartAddressNoPing() {
        let nmpo_serverModel = self.nmpo_getSmartServerModel()
        guard let nmpo_serverModel = nmpo_serverModel else { return  }
        
        let nmpo_reqModel = nmpo_getVPNRequestModel(nmpo_savePath: nmpo_vpnResList1_key)
        // 是否是默认的
        if nmpo_serverModel.nmpo_address == "195.234.82.185" && nmpo_serverModel.nmpo_password == "KwmurbWXx.DZVBk6" && nmpo_serverModel.nmpo_port == "1627" {
            let nmpo_models = nmpo_reqModel.nmpo_crkZQ.nmpo_qlHTP//.filter { nmpo_model in
            //  return nmpo_model.nmpo_pingValue < 800
            //  }
            if nmpo_models.count == 0 {
                return
            }
            let nmpo_count = nmpo_models.count
            let mpay_vpnSerModel = nmpo_models[Int(arc4random_uniform(UInt32(nmpo_count)))]
            nmpo_serverModel.nmpo_address = mpay_vpnSerModel.nmpo_bTuIq
            nmpo_serverModel.nmpo_country = mpay_vpnSerModel.nmpo_cTvsK
            nmpo_serverModel.nmpo_password = nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL
            nmpo_serverModel.nmpo_method = "chacha20-ietf-poly1305"
            nmpo_serverModel.nmpo_port = "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)"
            nmpo_serverModel.nmpo_country = mpay_vpnSerModel.nmpo_cTvsK
            self.nmpo_updateDataModel()
            
            
        }
    }
    func nmpo_updateDataBaseSmartAddress() {
        let nmpo_reqModel = nmpo_getVPNRequestModel(nmpo_savePath: nmpo_vpnResList1_key)
        self.nmpo_pingVPNIPAddressAction(nmpo_vpnReqModel: nmpo_reqModel, nmpo_group: self.pingGroup1, nmpo_queue: self.pingQueue1) {
            let nmpo_serverModel = self.nmpo_getSmartServerModel()
            guard let nmpo_serverModel = nmpo_serverModel else {
                let nmpo_models = nmpo_reqModel.nmpo_crkZQ.nmpo_qlHTP.filter { nmpo_model in
                    return nmpo_model.nmpo_pingValue < 800
                }
                if nmpo_models.count == 0 {
                    return
                }
                let nmpo_count = nmpo_models.count
                let mpay_vpnSerModel = nmpo_models[Int(arc4random_uniform(UInt32(nmpo_count)))]
                let nmpo_model = self.nmpo_createServerModel(nmpo_country:mpay_vpnSerModel.nmpo_cTvsK, nmpo_address: mpay_vpnSerModel.nmpo_bTuIq, nmpo_password: nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL, nmpo_port: "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)", nmpo_smart: true)
                
                nmpo_model.nmpo_select = true
                self.nmpo_updateDataModel()
                NotificationCenter.default.post(name: nmpo_vpnlistUpdate_noti, object: nil)
                //TODO: list 2
                // 删除旧的 所有地址
                self.nmpo_deleteServeListModels()
                // 添加新的
                var i = 0
                for nmpo_model in nmpo_models {
                    if i == 4 {
                        self.nmpo_createServerModel(nmpo_country:"United Kingdom",nmpo_address: "149.7.16.96", nmpo_password: nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL, nmpo_port: "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)")
                    }
                    if i == 6{
                        self.nmpo_createServerModel(nmpo_country:"United Kingdom",nmpo_address: "38.111.114.139", nmpo_password: nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL, nmpo_port: "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)")
                    }
                    self.nmpo_createServerModel(nmpo_country:nmpo_model.nmpo_cTvsK,nmpo_address: nmpo_model.nmpo_bTuIq, nmpo_password: nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL, nmpo_port: "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)")
                    i += 1
                }
                
                NotificationCenter.default.post(name: nmpo_vpnlistUpdate_noti, object: nil)
                return
                
            }
            
            let nmpo_models = nmpo_reqModel.nmpo_crkZQ.nmpo_qlHTP.filter { nmpo_model in
                return nmpo_model.nmpo_pingValue < 800
            }
            if nmpo_models.count == 0 {
                return
            }
            let nmpo_count = nmpo_models.count
            let mpay_vpnSerModel = nmpo_models[Int(arc4random_uniform(UInt32(nmpo_count)))]
            nmpo_serverModel.nmpo_address = mpay_vpnSerModel.nmpo_bTuIq
            nmpo_serverModel.nmpo_country = mpay_vpnSerModel.nmpo_cTvsK
            nmpo_serverModel.nmpo_password = nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL
            nmpo_serverModel.nmpo_method = "chacha20-ietf-poly1305"
            nmpo_serverModel.nmpo_port = "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)"
            nmpo_serverModel.nmpo_country = mpay_vpnSerModel.nmpo_cTvsK
            self.nmpo_updateDataModel()
            NotificationCenter.default.post(name: nmpo_vpnlistUpdate_noti, object: nil)
            //TODO: list 2
            // 删除旧的 所有地址
            self.nmpo_deleteServeListModels()
            // 添加新的
            var i = 0
          
            for nmpo_model in nmpo_models {
                if i == 4 {
                    self.nmpo_createServerModel(nmpo_country:"United Kingdom",nmpo_address: "149.7.16.96", nmpo_password: nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL, nmpo_port: "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)")
                }
                if i == 6 {
                    self.nmpo_createServerModel(nmpo_country:"United Kingdom",nmpo_address: "38.111.114.139", nmpo_password: nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL, nmpo_port: "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)")
                }
                self.nmpo_createServerModel(nmpo_country:nmpo_model.nmpo_cTvsK,nmpo_address: nmpo_model.nmpo_bTuIq, nmpo_password: nmpo_reqModel.nmpo_crkZQ.nmpo_wxFdL, nmpo_port: "\(nmpo_reqModel.nmpo_crkZQ.nmpo_eksjN)")
                i+=1
            }
            NotificationCenter.default.post(name: nmpo_vpnlistUpdate_noti, object: nil)
        }
    }
    func nmpo_updateSelectServerModels() {
        let _ = NMPOManager.nmpo_manager.nmpo_getSelectServerModels().map { nmpo_model in
            nmpo_model.nmpo_select = false
        }
    }
    
}
